package com.project.webservice.util;

import org.apache.commons.lang3.StringUtils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {
	
	public static String FORMAT_SIMPLE = "yyyyMMdd";
	/**
	 * 英文简写（默认）如：2010-12-01
	 */
	public static String FORMAT_SHORT = "yyyy-MM-dd";
	/**
	 * 英文全称 如：2010-12-01 23:15:06
	 */
	public static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 精确到毫秒的完整时间 如：yyyy-MM-dd HH:mm:ss.S
	 */
	public static String FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.S";
	/**
	 * 中文简写 如：2010年12月01日
	 */
	public static String FORMAT_SHORT_CN = "yyyy年MM月dd";
	/**
	 * 中文全称 如：2010年12月01日 23时15分06秒
	 */
	public static String FORMAT_LONG_CN = "yyyy年MM月dd日  HH时mm分ss秒";
	/**
	 * 精确到毫秒的完整中文时间
	 */
	public static String FORMAT_FULL_CN = "yyyy年MM月dd日  HH时mm分ss秒SSS毫秒";
	
	/**
	 * 时分
	 */
	public static String FORMAT_TIME_HH_MM = "HH:mm";
	
	/**
	 * 时分秒
	 */
	public static String FORMAT_TIME = "HH:mm:ss";
	
	/**
	 * 当前天数
	 */
	public static String FORMAT_DAY = "dd";

	/**
	 * 获得默认的 date pattern
	 */
	public static String getDatePattern() {
		return FORMAT_LONG;
	}

	/**
	 * 根据预设格式返回当前日期
	 * 
	 * @return
	 */
	public static String getNow() {
		return format(new Date());
	}

	/**
	 * 根据用户格式返回当前日期
	 * 
	 * @param format
	 * @return
	 */
	public static String getNow(String format) {
		return format(new Date(), format);
	}

	/**
	 * 使用预设格式格式化日期
	 * 
	 * @param date
	 * @return
	 */
	public static String format(Date date) {
		return format(date, getDatePattern());
	}

	/**
	 * 使用用户格式格式化日期
	 * 
	 * @param date
	 *            日期
	 * @param pattern
	 *            日期格式
	 * @return
	 */
	public static String format(Date date, String pattern) {
		String returnValue = "";
		if (date != null) {
			SimpleDateFormat df = new SimpleDateFormat(pattern);
			returnValue = df.format(date);
		}
		return (returnValue);
	}

	/**
	 * 使用预设格式提取字符串日期
	 * 
	 * @param strDate
	 *            日期字符串
	 * @return
	 * @throws ParseException 
	 */
	public static Date parse(String strDate) {
		return parse(strDate, getDatePattern());
	}

	/**
	 * 使用用户格式提取字符串日期
	 * 
	 * @param strDate
	 *            日期字符串
	 * @param pattern
	 *            日期格式
	 * @return
	 * @throws ParseException 
	 */
	public static Date parse(String strDate, String pattern) {
		if(StringUtils.isEmpty(strDate)){
			return null;
		}
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
			return df.parse(strDate);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 在日期上增加数个整月
	 * 
	 * @param date
	 *            日期
	 * @param n
	 *            要增加的月数
	 * @return
	 */
	public static Date addMonth(Date date, int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MONTH, n);
		return cal.getTime();
	}

	/**
	 * 在日期上增加天数
	 * 
	 * @param date
	 *            日期
	 * @param n
	 *            要增加的天数
	 * @return
	 */
	public static Date addDay(Date date, int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, n);
		return cal.getTime();
	}
	
	/**
	 * 在日期上增加分钟
	 * 
	 * @param date
	 *            日期
	 * @param n
	 *            要增加的天数
	 * @return
	 */
	public static Date addMinute(Date date, int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, n);
		return cal.getTime();
	}
	
	/**
	 * 增加秒
	 * @param date
	 * @param n
	 * @return
	 * @author zhangwei002
	 * @date 2017年6月12日 下午5:22:28
	 */
	public static Date addSecond(Date date, int n) {
	    Calendar cal = Calendar.getInstance();
	    cal.setTime(date);
	    cal.add(Calendar.SECOND, n);
	    return cal.getTime();
	}

	/**
	 * 获取时间戳
	 */
	public static String getTimeString() {
		SimpleDateFormat df = new SimpleDateFormat(FORMAT_FULL);
		Calendar calendar = Calendar.getInstance();
		return df.format(calendar.getTime());
	}

	/**
	 * 获取日期年份
	 * 
	 * @param date
	 *            日期
	 * @return
	 */
	public static String getYear(Date date) {
		return format(date).substring(0, 4);
	}
	
	/**
	 * 获取日期月份
	 * 
	 * @param date
	 *            日期
	 * @return
	 */
	public static String getMonth(Date date) {
		String month = format(date).substring(5, 7);
		if(month.startsWith("0")){
			return month.replace("0", "");
		}else{
			return month;
		}
	}

	/**
	 * 按默认格式的字符串距离今天的天数
	 * 
	 * @param date
	 *            日期字符串
	 * @return
	 * @throws ParseException 
	 */
	public static int countDays(String date) {
		long t = Calendar.getInstance().getTime().getTime();
		Calendar c = Calendar.getInstance();
		c.setTime(parse(date));
		long t1 = c.getTime().getTime();
		return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
	}

	/**
	 * 按用户格式字符串距离今天的天数
	 * 
	 * @param date
	 *            日期字符串
	 * @param format
	 *            日期格式
	 * @return
	 * @throws ParseException 
	 */
	public static int countDays(String date, String format) {
		long t = Calendar.getInstance().getTime().getTime();
		Calendar c = Calendar.getInstance();
		c.setTime(parse(date, format));
		long t1 = c.getTime().getTime();
		return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
	}
	public static String convenrtDateToStr(Date date ,String formate){
		SimpleDateFormat df = new SimpleDateFormat(formate);
		if(null!=date){
			return df.format(date);
		}
		return "";
	}
	public static String convenrtDataBefore(Date date ,String formate,Integer hour){
		if(null==date){
			return "";
		}
	    Calendar Cal= Calendar.getInstance();      
	    Cal.setTime(date);      
	    Cal.add(Calendar.HOUR_OF_DAY,hour);      
	   return  convenrtDateToStr(Cal.getTime(),formate);
	}
	
	/**
	 * 获取当天，没有时分秒
	 */
	public static Date getToday() {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		c.set(Calendar.MILLISECOND, 0);
		return c.getTime();
	}
	
	/**
	 * @Description: 截取时间
	 * @author zhangwei
	 */
	public static Date truncate(Date date, int field) {
		return org.apache.commons.lang3.time.DateUtils.truncate(date, field);
	}
	
	/**
	 * @Description: 截取时间
	 * @author zhangwei
	 */
	public static Calendar truncate(Calendar date, int field) {
		return org.apache.commons.lang3.time.DateUtils.truncate(date, field);
	}
	
	/**
	 * @param date
	 *            日期
	 * @param otherDate
	 *            另一个日期
	 * @return 相差天数
	 */
	public static int getIntervalDays(Date date, Date otherDate) {
		long time = Math.abs(date.getTime() - otherDate.getTime());
		return (int) time / (24 * 60 * 60 * 1000);
	}
	
	/**
	 * @param date 日期
	 * @param otherDate 另一个日期
	 * @Description:日期相差分钟数
	 * @return
	 */
	public static Long getIntervalMinutes(Date date, Date otherDate) {
		long time = Math.abs(date.getTime() - otherDate.getTime());
		return (long) time == 0 ? 0 : time/(60 * 1000);
	}
	
	/**
	 * 当前日期数
	 * 
	 * @return
	 */
	public static String getTodayId() {
		return format(new Date(), FORMAT_DAY);
	}
	
	/**
	 * 当前日期月份天数
	 * @param date
	 * @return
	 */
	public static int getDaysOfMonth(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.getActualMaximum(Calendar.DATE);
	}
	
	/**
	 * 获取一个月的第一天
	 * @param date
	 * @param format
	 * @return
	 */
	public static String getFirstDayOfMonth(Date date, String format) {
		if (StringUtils.isBlank(format)) {
			format = FORMAT_LONG;
		}
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.DAY_OF_MONTH, 1);
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		return format(c.getTime(), format);
	}

	/**
	 * Long转 LocalDateTime
	 * @param stamp
	 * @return
	 */
	public static LocalDateTime stampToLocalDateTime(Long stamp){
		return LocalDateTime.ofInstant(Instant.ofEpochMilli(stamp), ZoneId.systemDefault());
	}

	/**
	 * LocalDateTime转 Long
	 * @param dateTime
	 * @return
	 */
	public static Long LocalDateTimeTostamp(LocalDateTime dateTime){
		return Timestamp.valueOf(dateTime).getTime();
	}



	/**
	 * Str转 LocalDateTime
	 * @param str
	 * @return
	 */
	public static LocalDate StrToLocalDate(String str,String pattern){
		Date date = DateUtils.parse(str,pattern);
		LocalDate localDate =  date.toInstant().atZone( ZoneId.systemDefault()).toLocalDate();
		return localDate;
	}
	/**
	 * Str转 LocalDateTime
	 * @param str
	 * @return
	 */
	public static LocalDateTime StrToLocalDateTime(String str){
		Date date = DateUtils.parse(str,"yyyy/MM/dd HH:mm:ss");
		LocalDateTime localDateTime =  date.toInstant().atZone( ZoneId.systemDefault()).toLocalDateTime();
		return localDateTime;
	}

	/**
	 * Str转 LocalDateTime
	 * @param str
	 * @return
	 */
	public static LocalDateTime StrToLocalDateTime(String str,String pattern){
		Date date = DateUtils.parse(str,pattern);
		LocalDateTime localDateTime =  date.toInstant().atZone( ZoneId.systemDefault()).toLocalDateTime();
		return localDateTime;
	}

	/**
	 * LocalDateTime 转成 Date
	 * @param localDateTime
	 * @return
	 */
	public static Date covertDate(LocalDateTime localDateTime){
		return  Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());


	}
}

